home *** CD-ROM | disk | FTP | other *** search
- package java.awt;
-
- import java.awt.event.ActionEvent;
- import java.awt.event.FocusEvent;
- import java.awt.event.InputEvent;
- import java.awt.event.InputMethodEvent;
- import java.awt.event.InvocationEvent;
- import java.awt.event.KeyEvent;
- import java.awt.event.MouseEvent;
- import java.awt.event.PaintEvent;
- import java.awt.event.WindowEvent;
- import java.awt.peer.ComponentPeer;
- import java.lang.ref.WeakReference;
- import java.lang.reflect.InvocationTargetException;
- import java.security.AccessController;
- import java.util.EmptyStackException;
- import sun.awt.AWTAutoShutdown;
- import sun.awt.AppContext;
- import sun.awt.DebugHelper;
- import sun.awt.PeerEvent;
- import sun.awt.SunToolkit;
-
- public class EventQueue {
- private static final DebugHelper dbg = DebugHelper.create(EventQueue.class);
- private static int threadInitNumber;
- private static final int LOW_PRIORITY = 0;
- private static final int NORM_PRIORITY = 1;
- private static final int HIGH_PRIORITY = 2;
- private static final int ULTIMATE_PRIORITY = 3;
- private static final int NUM_PRIORITIES = 4;
- private Queue[] queues = new Queue[4];
- private EventQueue nextQueue;
- private EventQueue previousQueue;
- private EventDispatchThread dispatchThread;
- private final ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
- private final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- private static final boolean debug = false;
- private long mostRecentEventTime = System.currentTimeMillis();
- private WeakReference currentEvent;
- private int waitForID;
- private final String name = "AWT-EventQueue-" + nextThreadNum();
- private static final int PAINT = 0;
- private static final int UPDATE = 1;
- private static final int MOVE = 2;
- private static final int DRAG = 3;
- private static final int PEER = 4;
- private static final int CACHE_LENGTH = 5;
-
- private static synchronized int nextThreadNum() {
- return threadInitNumber++;
- }
-
- public EventQueue() {
- for(int var1 = 0; var1 < 4; ++var1) {
- this.queues[var1] = new Queue();
- }
-
- }
-
- public void postEvent(AWTEvent var1) {
- SunToolkit.flushPendingEvents();
- this.postEventPrivate(var1);
- }
-
- final void postEventPrivate(AWTEvent var1) {
- var1.isPosted = true;
- synchronized(this) {
- if (this.dispatchThread == null && this.nextQueue == null) {
- if (var1.getSource() == AWTAutoShutdown.getInstance()) {
- return;
- }
-
- this.initDispatchThread();
- }
-
- if (this.nextQueue != null) {
- this.nextQueue.postEventPrivate(var1);
- } else {
- this.postEvent(var1, getPriority(var1));
- }
- }
- }
-
- private static int getPriority(AWTEvent var0) {
- if (var0 instanceof PeerEvent && (((PeerEvent)var0).getFlags() & 2L) != 0L) {
- return 3;
- } else if (var0 instanceof PeerEvent && (((PeerEvent)var0).getFlags() & 1L) != 0L) {
- return 2;
- } else if (var0 instanceof PeerEvent && (((PeerEvent)var0).getFlags() & 4L) != 0L) {
- return 0;
- } else {
- int var1 = var0.getID();
- return var1 != 800 && var1 != 801 ? 1 : 0;
- }
- }
-
- private void postEvent(AWTEvent var1, int var2) {
- Object var3 = var1.getSource();
- if (!this.coalesceEvent(var1, var2)) {
- EventQueueItem var4 = new EventQueueItem(var1);
- this.cacheEQItem(var4);
- boolean var5 = var1.getID() == this.waitForID;
- if (this.queues[var2].head == null) {
- boolean var6 = this.noEvents();
- this.queues[var2].head = this.queues[var2].tail = var4;
- if (var6) {
- if (var1.getSource() != AWTAutoShutdown.getInstance()) {
- AWTAutoShutdown.getInstance().notifyThreadBusy(this.dispatchThread);
- }
-
- this.notifyAll();
- } else if (var5) {
- this.notifyAll();
- }
- } else {
- this.queues[var2].tail.next = var4;
- this.queues[var2].tail = var4;
- if (var5) {
- this.notifyAll();
- }
- }
-
- }
- }
-
- private boolean coalescePaintEvent(PaintEvent var1) {
- ComponentPeer var2 = ((Component)var1.getSource()).peer;
- if (var2 != null) {
- var2.coalescePaintEvent(var1);
- }
-
- EventQueueItem[] var3 = ((Component)var1.getSource()).eventCache;
- if (var3 == null) {
- return false;
- } else {
- int var4 = eventToCacheIndex(var1);
- if (var4 != -1 && var3[var4] != null) {
- PaintEvent var5 = this.mergePaintEvents(var1, (PaintEvent)var3[var4].event);
- if (var5 != null) {
- var3[var4].event = var5;
- return true;
- }
- }
-
- return false;
- }
- }
-
- private PaintEvent mergePaintEvents(PaintEvent var1, PaintEvent var2) {
- Rectangle var3 = var1.getUpdateRect();
- Rectangle var4 = var2.getUpdateRect();
- if (var4.contains(var3)) {
- return var2;
- } else {
- return var3.contains(var4) ? var1 : null;
- }
- }
-
- private boolean coalesceMouseEvent(MouseEvent var1) {
- EventQueueItem[] var2 = ((Component)var1.getSource()).eventCache;
- if (var2 == null) {
- return false;
- } else {
- int var3 = eventToCacheIndex(var1);
- if (var3 != -1 && var2[var3] != null) {
- var2[var3].event = var1;
- return true;
- } else {
- return false;
- }
- }
- }
-
- private boolean coalescePeerEvent(PeerEvent var1) {
- EventQueueItem[] var2 = ((Component)var1.getSource()).eventCache;
- if (var2 == null) {
- return false;
- } else {
- int var3 = eventToCacheIndex(var1);
- if (var3 != -1 && var2[var3] != null) {
- var1 = var1.coalesceEvents((PeerEvent)var2[var3].event);
- if (var1 != null) {
- var2[var3].event = var1;
- return true;
- }
-
- var2[var3] = null;
- }
-
- return false;
- }
- }
-
- private boolean coalesceOtherEvent(AWTEvent var1, int var2) {
- int var3 = var1.getID();
- Component var4 = (Component)var1.getSource();
-
- for(EventQueueItem var5 = this.queues[var2].head; var5 != null; var5 = var5.next) {
- if (var5.event.getSource() == var4 && var5.id == var3) {
- AWTEvent var6 = var4.coalesceEvents(var5.event, var1);
- if (var6 != null) {
- var5.event = var6;
- return true;
- }
- }
- }
-
- return false;
- }
-
- private boolean coalesceEvent(AWTEvent var1, int var2) {
- if (!(var1.getSource() instanceof Component)) {
- return false;
- } else if (var1 instanceof PeerEvent) {
- return this.coalescePeerEvent((PeerEvent)var1);
- } else if (((Component)var1.getSource()).isCoalescingEnabled() && this.coalesceOtherEvent(var1, var2)) {
- return true;
- } else if (var1 instanceof PaintEvent) {
- return this.coalescePaintEvent((PaintEvent)var1);
- } else {
- return var1 instanceof MouseEvent ? this.coalesceMouseEvent((MouseEvent)var1) : false;
- }
- }
-
- private void cacheEQItem(EventQueueItem var1) {
- int var2 = eventToCacheIndex(var1.event);
- if (var2 != -1 && var1.event.getSource() instanceof Component) {
- Component var3 = (Component)var1.event.getSource();
- if (var3.eventCache == null) {
- var3.eventCache = new EventQueueItem[5];
- }
-
- var3.eventCache[var2] = var1;
- }
-
- }
-
- private void uncacheEQItem(EventQueueItem var1) {
- int var2 = eventToCacheIndex(var1.event);
- if (var2 != -1 && var1.event.getSource() instanceof Component) {
- Component var3 = (Component)var1.event.getSource();
- if (var3.eventCache == null) {
- return;
- }
-
- var3.eventCache[var2] = null;
- }
-
- }
-
- private static int eventToCacheIndex(AWTEvent var0) {
- switch (var0.getID()) {
- case 503:
- return 2;
- case 506:
- return 3;
- case 800:
- return 0;
- case 801:
- return 1;
- default:
- return var0 instanceof PeerEvent ? 4 : -1;
- }
- }
-
- private boolean noEvents() {
- for(int var1 = 0; var1 < 4; ++var1) {
- if (this.queues[var1].head != null) {
- return false;
- }
- }
-
- return true;
- }
-
- public AWTEvent getNextEvent() throws InterruptedException {
- while(true) {
- SunToolkit.flushPendingEvents();
- synchronized(this) {
- for(int var2 = 3; var2 >= 0; --var2) {
- if (this.queues[var2].head != null) {
- EventQueueItem var3 = this.queues[var2].head;
- this.queues[var2].head = var3.next;
- if (var3.next == null) {
- this.queues[var2].tail = null;
- }
-
- this.uncacheEQItem(var3);
- return var3.event;
- }
- }
-
- AWTAutoShutdown.getInstance().notifyThreadFree(this.dispatchThread);
- this.wait();
- }
- }
- }
-
- AWTEvent getNextEvent(int var1) throws InterruptedException {
- while(true) {
- SunToolkit.flushPendingEvents();
- synchronized(this) {
- for(int var3 = 0; var3 < 4; ++var3) {
- EventQueueItem var4 = this.queues[var3].head;
-
- for(EventQueueItem var5 = null; var4 != null; var4 = var4.next) {
- if (var4.id == var1) {
- if (var5 == null) {
- this.queues[var3].head = var4.next;
- } else {
- var5.next = var4.next;
- }
-
- if (this.queues[var3].tail == var4) {
- this.queues[var3].tail = var5;
- }
-
- this.uncacheEQItem(var4);
- return var4.event;
- }
-
- var5 = var4;
- }
- }
-
- this.waitForID = var1;
- this.wait();
- this.waitForID = 0;
- }
- }
- }
-
- public synchronized AWTEvent peekEvent() {
- for(int var1 = 3; var1 >= 0; --var1) {
- if (this.queues[var1].head != null) {
- return this.queues[var1].head.event;
- }
- }
-
- return null;
- }
-
- public synchronized AWTEvent peekEvent(int var1) {
- for(int var2 = 3; var2 >= 0; --var2) {
- for(EventQueueItem var3 = this.queues[var2].head; var3 != null; var3 = var3.next) {
- if (var3.id == var1) {
- return var3.event;
- }
- }
- }
-
- return null;
- }
-
- protected void dispatchEvent(AWTEvent var1) {
- var1.isPosted = true;
- Object var2 = var1.getSource();
- if (var1 instanceof ActiveEvent) {
- this.setCurrentEventAndMostRecentTimeImpl(var1);
- ((ActiveEvent)var1).dispatch();
- } else if (var2 instanceof Component) {
- ((Component)var2).dispatchEvent(var1);
- var1.dispatched();
- } else if (var2 instanceof MenuComponent) {
- ((MenuComponent)var2).dispatchEvent(var1);
- } else if (var2 instanceof TrayIcon) {
- ((TrayIcon)var2).dispatchEvent(var1);
- } else if (var2 instanceof AWTAutoShutdown) {
- if (this.noEvents()) {
- this.dispatchThread.stopDispatching();
- }
- } else {
- System.err.println("unable to dispatch event: " + var1);
- }
-
- }
-
- public static long getMostRecentEventTime() {
- return Toolkit.getEventQueue().getMostRecentEventTimeImpl();
- }
-
- private synchronized long getMostRecentEventTimeImpl() {
- return Thread.currentThread() == this.dispatchThread ? this.mostRecentEventTime : System.currentTimeMillis();
- }
-
- synchronized long getMostRecentEventTimeEx() {
- return this.mostRecentEventTime;
- }
-
- public static AWTEvent getCurrentEvent() {
- return Toolkit.getEventQueue().getCurrentEventImpl();
- }
-
- private synchronized AWTEvent getCurrentEventImpl() {
- return Thread.currentThread() == this.dispatchThread ? (AWTEvent)this.currentEvent.get() : null;
- }
-
- public synchronized void push(EventQueue var1) {
- if (this.nextQueue != null) {
- this.nextQueue.push(var1);
- } else {
- synchronized(var1) {
- while(this.peekEvent() != null) {
- try {
- var1.postEventPrivate(this.getNextEvent());
- } catch (InterruptedException var5) {
- }
- }
-
- var1.previousQueue = this;
- }
-
- if (this.dispatchThread != null) {
- this.dispatchThread.stopDispatchingLater();
- }
-
- this.nextQueue = var1;
- AppContext var2 = AppContext.getAppContext();
- if (var2.get(AppContext.EVENT_QUEUE_KEY) == this) {
- var2.put(AppContext.EVENT_QUEUE_KEY, var1);
- }
-
- }
- }
-
- protected void pop() throws EmptyStackException {
- EventQueue var1 = this.previousQueue;
- synchronized(var1 != null ? var1 : this) {
- label61: {
- synchronized(this) {
- if (this.nextQueue == null) {
- if (this.previousQueue == null) {
- throw new EmptyStackException();
- }
-
- this.previousQueue.nextQueue = null;
-
- while(this.peekEvent() != null) {
- try {
- this.previousQueue.postEventPrivate(this.getNextEvent());
- } catch (InterruptedException var7) {
- }
- }
-
- AppContext var4 = AppContext.getAppContext();
- if (var4.get(AppContext.EVENT_QUEUE_KEY) == this) {
- var4.put(AppContext.EVENT_QUEUE_KEY, this.previousQueue);
- }
-
- this.previousQueue = null;
- break label61;
- }
-
- this.nextQueue.pop();
- }
-
- return;
- }
- }
-
- EventDispatchThread var2 = this.dispatchThread;
- if (var2 != null) {
- var2.stopDispatching();
- }
-
- }
-
- public static boolean isDispatchThread() {
- EventQueue var0 = Toolkit.getEventQueue();
-
- for(EventQueue var1 = var0.nextQueue; var1 != null; var1 = var1.nextQueue) {
- var0 = var1;
- }
-
- return Thread.currentThread() == var0.dispatchThread;
- }
-
- final void initDispatchThread() {
- synchronized(this) {
- if (this.dispatchThread == null && !this.threadGroup.isDestroyed()) {
- this.dispatchThread = (EventDispatchThread)AccessController.doPrivileged(new 1(this));
- AWTAutoShutdown.getInstance().notifyThreadBusy(this.dispatchThread);
- this.dispatchThread.start();
- }
-
- }
- }
-
- final void detachDispatchThread() {
- this.dispatchThread = null;
- }
-
- final EventDispatchThread getDispatchThread() {
- return this.dispatchThread;
- }
-
- final void removeSourceEvents(Object var1, boolean var2) {
- SunToolkit.flushPendingEvents();
- synchronized(this) {
- for(int var4 = 0; var4 < 4; ++var4) {
- EventQueueItem var5 = this.queues[var4].head;
-
- EventQueueItem var6;
- for(var6 = null; var5 != null; var5 = var5.next) {
- if (var5.event.getSource() == var1 && (var2 || !(var5.event instanceof SequencedEvent) && !(var5.event instanceof SentEvent) && !(var5.event instanceof FocusEvent) && !(var5.event instanceof WindowEvent) && !(var5.event instanceof KeyEvent) && !(var5.event instanceof InputMethodEvent))) {
- if (var5.event instanceof SequencedEvent) {
- ((SequencedEvent)var5.event).dispose();
- }
-
- if (var5.event instanceof SentEvent) {
- ((SentEvent)var5.event).dispose();
- }
-
- if (var6 == null) {
- this.queues[var4].head = var5.next;
- } else {
- var6.next = var5.next;
- }
-
- this.uncacheEQItem(var5);
- } else {
- var6 = var5;
- }
- }
-
- this.queues[var4].tail = var6;
- }
-
- }
- }
-
- static void setCurrentEventAndMostRecentTime(AWTEvent var0) {
- Toolkit.getEventQueue().setCurrentEventAndMostRecentTimeImpl(var0);
- }
-
- private synchronized void setCurrentEventAndMostRecentTimeImpl(AWTEvent var1) {
- if (Thread.currentThread() == this.dispatchThread) {
- this.currentEvent = new WeakReference(var1);
- long var2 = Long.MIN_VALUE;
- if (var1 instanceof InputEvent) {
- InputEvent var4 = (InputEvent)var1;
- var2 = var4.getWhen();
- } else if (var1 instanceof InputMethodEvent) {
- InputMethodEvent var5 = (InputMethodEvent)var1;
- var2 = var5.getWhen();
- } else if (var1 instanceof ActionEvent) {
- ActionEvent var6 = (ActionEvent)var1;
- var2 = var6.getWhen();
- } else if (var1 instanceof InvocationEvent) {
- InvocationEvent var7 = (InvocationEvent)var1;
- var2 = var7.getWhen();
- }
-
- this.mostRecentEventTime = Math.max(this.mostRecentEventTime, var2);
- }
- }
-
- public static void invokeLater(Runnable var0) {
- Toolkit.getEventQueue().postEvent(new InvocationEvent(Toolkit.getDefaultToolkit(), var0));
- }
-
- public static void invokeAndWait(Runnable var0) throws InterruptedException, InvocationTargetException {
- if (isDispatchThread()) {
- throw new Error("Cannot call invokeAndWait from the event dispatcher thread");
- } else {
- 1AWTInvocationLock var1 = new 1AWTInvocationLock();
- InvocationEvent var2 = new InvocationEvent(Toolkit.getDefaultToolkit(), var0, var1, true);
- synchronized(var1) {
- Toolkit.getEventQueue().postEvent(var2);
- var1.wait();
- }
-
- Throwable var3 = var2.getThrowable();
- if (var3 != null) {
- throw new InvocationTargetException(var3);
- }
- }
- }
-
- private void wakeup(boolean var1) {
- synchronized(this) {
- if (this.nextQueue != null) {
- this.nextQueue.wakeup(var1);
- } else if (this.dispatchThread != null) {
- this.notifyAll();
- } else if (!var1) {
- this.initDispatchThread();
- }
-
- }
- }
-
- // $FF: synthetic method
- static ThreadGroup access$000(EventQueue var0) {
- return var0.threadGroup;
- }
-
- // $FF: synthetic method
- static String access$100(EventQueue var0) {
- return var0.name;
- }
-
- // $FF: synthetic method
- static ClassLoader access$200(EventQueue var0) {
- return var0.classLoader;
- }
- }
-